# 方式一【编译阶段与运行阶段分离】
# 构建镜像命令
# docker build -t gomicrogrpc-gateway-api:v1.0.0-dev --build-arg RUNENV=dev --build-arg PORT=9501 .
# docker build -t gomicrogrpc-gateway-api:v1.0.0-test --build-arg RUNENV=test --build-arg PORT=9501 .
# docker build -t gomicrogrpc-gateway-api:v1.0.0 --build-arg RUNENV=prod --build-arg PORT=9501 .
# 打包依赖阶段使用golang作为基础镜像
FROM golang:1.18.0 AS builder

# 设置环境变量
ENV GO111MODULE=on  GOPROXY=http://goproxy.cn
# ENV GOROOT=/usr/local/go  PATH=$PATH:/usr/local/go/bin  GOPATH=$HOME/go  PATH=$GOPATH/bin/:$PATH

# 工作目录
WORKDIR /home/www/gateway_api

# 创建用户
RUN adduser -u 8000 app-runner

# 复制文件
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .

# 运行命令【编译代码】
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gateway-api main.go
# RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -installsuffix cgo -o web_serve main.go

# 运行阶段
FROM alpine:3.17.0 AS final

# 添加时区
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai

# 工作目录
WORKDIR /app

# 复制系统文件
COPY --from=builder /etc/passwd /etc/passwd

# 复制编译好的项目二进制文件到运行的目录中
COPY --from=builder /home/www/gateway_api/gateway-api /app/
# 复制项目配置文件到运行的目录中
COPY --from=builder /home/www/gateway_api/config /app/config
# 复制项目 proto 文件到运行的目录中
COPY --from=builder /home/www/gateway_api/proto /app/proto
# 复制更多文件...

# 修改项目的拥有者
RUN chown -R 8000.8000 /app

# 声明项目运行环境构建参数
# docker build -t gomicrogrpc-gateway-api:v1.0.0-test --build-arg RUNENV=test .
# 在Dockerfile中，`ENTRYPOINT`指令用于设置容器启动时运行的命令。而`ARG`指令用于定义构建时使用的变量。但是，`ARG`变量在构建过程中是有效的，一旦构建完成，在容器运行时环境变量将不可用。因此，如果你想在`ENTRYPOINT`中使用构建时的变量，需要采用一些技巧。
# 在构建过程中将`ARG`的值保存到环境变量中：通过`ENV`指令将`ARG`的值设置为环境变量，这样在容器运行时该环境变量仍然可用。然后，在`ENTRYPOINT`的脚本中引用该环境变量。
# 不传默认：dev
ARG RUNENV=dev
RUN echo "Building for Run Environment: ${RUNENV}"
ENV RUNENV=$RUNENV

# 声明项目端口构建参数
# docker build -t mall-gateway-api:v1.0.0 --build-arg RUNENV=test --build-arg PORT=9501 .
# 不传默认：9501
ARG PORT=9501
RUN echo "Building for Run port: ${PORT}"
# 检查镜像暴露的端口
# docker image inspect mall-gateway-api:v1.0.1 --format='{{.Config.ExposedPorts}}'

# 暴露端口
EXPOSE $PORT

# 运行用户
USER app-runner

# 执行命令
ENTRYPOINT ["sh", "-c", "/app/gateway-api --env $RUNENV"]
# ENTRYPOINT [ "/app/gateway-api", "--env", "prod" ]



#################################################################3
# 方式二【构建编译好的项目】
# 基础镜像
# FROM alpine:3.17.0

# 添加时区
# RUN apk add --no-cache tzdata
# ENV TZ Asia/Shanghai

# # 复制项目所有文件到容器目录下
# COPY . /app/demo_gateway_api

# # 项目工作目录
# WORKDIR /app/demo_gateway_api

# # 创建用户
# RUN adduser -u 8000 -HD app-runner

# # 修改项目的拥有者
# RUN chown -R 8000.8000 /app

# # 运行用户
# USER app-runner

# # 暴露端口
# EXPOSE 9501

# # 执行命令
# ENTRYPOINT ["/app/gateway-api", "--env", "prod"]

